package root.main;

import java.util.Scanner;

import exceptions.InvalidAtributException;
import exceptions.InvalidSession;
import exceptions.SessionDoesNotExist;
import exceptions.UserNotExistsException;

import root.MainManager;

public class Main {
	private Scanner sc;
	private MainManager mainManager;
	private boolean ativo;

	public Main() {
		sc = new Scanner(System.in);
		mainManager = MainManager.getMainManager();
		ativo = false;
	}
	
	public static void main(String[] args) {
		Main main = new Main();
		main.start();
	}
	
	public void start() {
		menuPrincipal();
	}
	
	private void menuPrincipal() {
		ativo = true;
		while(ativo){
			System.out.println(MenuText.menuPrincipal);
			switch(readInteger("0~3: ")){
			case 0:
				sair();
				break;
			case 1:
				menuSistema();
				break;
			case 2:
				menuSocial();
				break;
			case 3:
				menuNegocios();
				break;
			default:
				opcaoInvalida();
			}
		}	
	}
	
	private void opcaoInvalida() {
		System.out.println("Opcao invalida!");
	}

	private void sair() {
		ativo = false;
		System.out.println("Adeus!");
	}
	
	private void menuSistema() {
		System.out.println(MenuText.menuSistema);
		switch(readInteger("1~2: ")) {
		case 1:
			encerrarSistema();
			break;
		case 2:
			zerarSistema();
			break;
		default:
			opcaoInvalida();
		}
	}
	
	private void menuSocial() {
		System.out.println(MenuText.menuSocial);
		switch(readInteger("1~3: ")) {
		case 1:
			menuUsuarios();
			break;
		case 2:
			menuMensagens();
			break;
		case 3:
			menuAmizades();
			break;
		default:
			opcaoInvalida();
		}
	}
	
	private void menuNegocios() {
		System.out.println(MenuText.menuNegocios);
		switch(readInteger("1~2: ")) {
		case 1:
			menuItens();
			break;
		case 2:
			menuEmprestimos();
			break;
		default:
			opcaoInvalida();
		}
	}

	private void menuEmprestimos() {
		System.out.println(MenuText.menuEmprestimo);
		switch(readInteger("1~5: ")) {
		case 1:
			listaDeEmprestimos();
			break;
		case 2:
			requisitarEmprestimo();
			break;
		case 3:
			aprovarEmprestimo();
			break;
		case 4:
			requisitarDevolucao();
			break;
		case 5:
			confirmarTerminoDeEmprestimo();
			break;
		default:
			opcaoInvalida();
		}
	}

	private void menuItens() {
		System.out.println(MenuText.menuItens);
		switch(readInteger("1~8: ")) {
		case 1:
			cadastrarItem();
			break;
		case 2:
			getAtributoItem();
			break;
		case 3:
			pesquisarItem();
			break;
		case 4:
			listaDeItens();
			break;
		case 5:
			listaDeItensComLogin();
			break;
		case 6:
			devolverItem();
			break;
		case 7:
			apagarItem();
			break;
		case 8:
			registrarInteresse();
			break;
		case 9 :
			publicarPedido();
			break;
		case 10:
			oferecerItem();
			break;
		case 11:
			republicarPedido();
			break;
		default:
			opcaoInvalida();
		}
	}
	
	private void republicarPedido() {
		try {
			mainManager.rePublicarPedido(readLine("Id Seção: "), readLine("Id Pedido: "));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}		
	}

	private void oferecerItem() {
		try {
			mainManager.oferecerItem(readLine("Id Seção: "), readLine("Id Pedido: "), readLine("Id Item: "));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}

	private void publicarPedido() {
		try {
			System.out.println(mainManager.publicarPedido(readLine("Id Seção: "), readLine("Nome do Item"), readLine("Descrição do Item")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}

	private void menuAmizades() {
		System.out.println(MenuText.menuAmizades);
		switch(readInteger("1~7: ")) {
		case 1:
			requisicoesDeAmizade();
			break;
		case 2:
			requisitarAmizade();
			break;
		case 3:
			aprovarAmizade();
			break;
		case 4:
			verificarAmizade();
			break;
		case 5:
			listaDeAmigos();
			break;
		case 6:
			listaDeAmigosComLogin();
			break;
		case 7:
			desfazerAmizade();
			break;
		default:
			opcaoInvalida();
		}
	}
	
	private void menuMensagens() {
		System.out.println(MenuText.menuMensagens);
		switch(readInteger("1~6: ")) {
		case 1:
			enviarMensagem();
		break;
		case 2:
			lerMensagens();
			break;
		case 3:
			lerTopicos();
			break;
		default:
			opcaoInvalida();
		}
	}
	
	private void enviarMensagem() {
		System.out.println("1 Offtopic\n2 Negocio\n");
		switch(readInteger("1~2: ")) {
		case 1:
			enviarMensagemOfftopic();
		break;
		case 2:
			enviarMensagemNegocio();
		break;
		default:
			opcaoInvalida();
		}
	}
	
	private void menuUsuarios() {
		System.out.println(MenuText.menuUsuarios);
		switch(readInteger("1~7: ")) {
		case 1:
			localizarUsuario();
			break;
		case 2:
			localizarUsuarios();
			break;
		case 3:
			ranking();
			break;
		case 4:
			getAtributoUsuario();
			break;
		case 5:
			criaUsuario();
			break;
		case 6:
			abrirSessao();
			break;
		case 7:
			historicoUsuario();
			break;
		case 8:
			historicoCompartilhadoUsuario();
			break;
		default:
			opcaoInvalida();
		}
	}
	
	private void historicoCompartilhadoUsuario() {
		try {
			System.out.println(mainManager.historicoAtividadesConjunto(readLine("Id seção")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	private void historicoUsuario() {
		try {
			System.out.println(mainManager.historicoAtividades(readLine("Id seção")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}

	private void encerrarSistema() {
		MainManager.encerrarSistema();
		System.out.println("Sistema encerrado!");
	}
	
	private void zerarSistema() {
		MainManager.zerarSistema();
		System.out.println("Sistema zerado!");
	}
	
	private void registrarInteresse() {
		try {
			mainManager.registrarInteresse(
					readLine("Id da Sessao: "),
					readLine("Id do Item: "));
			System.out.println("Interesse registrado!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}
	
	private void confirmarTerminoDeEmprestimo() {
		try {
			mainManager.confirmarTerminoEmprestimo(
					readLine("Id da Sessao: "),
					readLine("Id do Emprestimo: "));
			System.out.println("Confirmado!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}
	
	private void requisitarDevolucao() {
		try {
			mainManager.requisitarDevolucao(
					readLine("Id da Sessao: "),
					readLine("Id do Emprestimo: "));
			System.out.println("Devolucao requisitada!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void apagarItem() {
		try {
			mainManager.apagarItem(
					readLine("Id da sessao: "),
					readLine("Id do item: "));
			System.out.println("Item apagado!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}			
	}
	
	private void devolverItem() {
		try {
			mainManager.devolverItem(
					readLine("Id da Sessao: "),
					readLine("Id do Emprestimo: "));
			System.out.println("Item devolvido!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}			
	}
	
	private void aprovarEmprestimo() {
		try {
			System.out.printf("Id: %s\n",
					mainManager.aprovarEmprestimo(
							readLine("Id da Sessao: "),
							readLine("Id da Requisicao de Emprestimo: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}		
	}
	
	private int readInteger(String prompt) {
		System.out.printf(prompt);
		return Integer.parseInt(sc.nextLine());
	}
	
	private void requisitarEmprestimo() {
		try {
			System.out.printf("Id: %s\n",
					mainManager.requisitarEmprestimo(
							readLine("Id da Sessao: "),
							readLine("Id do Item: "),
							readInteger("Duracao: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}
	
	private void listaDeEmprestimos() {
		try {
			System.out.printf("Lista: %s\n",
					mainManager.getEmprestimos(
							readLine("Id da Sessao: "),
							readLine("Tipo: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}
	
	private void desfazerAmizade() {
		try {
			mainManager.desfazerAmizade(
					readLine("Id da sessao: "),
					readLine("Amigo: "));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}
	
	private void listaDeItens() {
		try {
			System.out.printf("Itens: %s\n",
					mainManager.getItens(readLine("Id da sessao: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}
	
	private void listaDeItensComLogin() {
		try {
			System.out.printf("Itens: %s\n",
					mainManager.getItens(
							readLine("Id da sessao: "),
							readLine("Login: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}
	
	private void listaDeAmigosComLogin() {
		try {
			System.out.printf("Amigos: %s\n",
					mainManager.getAmigos(
							readLine("Id da Sessao: "),
							readLine("Login: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void listaDeAmigos() {
		try {
			System.out.printf("Amigos: %s\n",
					mainManager.getAmigos(readLine("Id da Sessao: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void verificarAmizade() {
		try {
			System.out.printf("Resultado: %s\n",
					mainManager.ehAmigo(
							readLine("Id da Sessao: "),
							readLine("login: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void aprovarAmizade() {
		try {
			mainManager.aprovarAmizade(readLine("Id da sessao: "),
					readLine("Login do usuario a ser aprovado: "));
			System.out.println("Aprovada!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void requisitarAmizade() {
		try {
			mainManager.requisitarAmizade(
					readLine("Id da Sessao: "),
					readLine("Login de seu Amigo: "));
			System.out.println("Requisitada!");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void localizarUsuario() { 
		try {
			System.out.println(mainManager.localizarUsuario(
					readLine("Id da Sessao: "),
					readLine("Chave: "),
					readLine("Atributo: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void localizarUsuarios() {
		try {
			System.out.println(mainManager.localizarUsuario(readLine("Id da Sessao: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void requisicoesDeAmizade() {
		try {
			System.out.printf("Requisicoes: %s\n",
				mainManager.getRequisicoesDeAmizade(readLine("Id da Sessao: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void lerMensagens() {
		try {
			 System.out.printf("Mensagens: %s\n",
					 mainManager.lerMensagens(
							 readLine("Id da Sessao: "),
							 readLine("Id do Topico: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void ranking() {
		try {
			System.out.printf("Ranking: %s\n",
					mainManager.getRanking(
							readLine("Id da Sessao: "),
							readLine("Categoria {global, amigos}: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void lerTopicos() {
		try {
			System.out.printf("Topicos: %s\n",
					mainManager.lerTopicos(
							readLine("Id da Sessao: "),
							readLine("Tipo {offtopic, negociacao, todos}: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void enviarMensagemNegocio() {
		try {
			System.out.printf("Id do topico: %s\n",
				mainManager.enviarMensagem(
						readLine("Id da Sessao: "),
						readLine("Destinatario: "),
						readLine("Assunto: "),
						readLine("Mensagem: "),
						readLine("Id Requisicao de Emprestimo: "))
				);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void enviarMensagemOfftopic() {
		try {
			System.out.printf("Id do topico: %s\n",
				mainManager.enviarMensagem(
						readLine("Id da Sessao: "),
						readLine("Destinatario: "),
						readLine("Assunto: "),
						readLine("Mensagem: "))
					);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private String readLine(String prompt) {
		System.out.print(prompt);
		String resp= sc.nextLine();
		return resp ;
	}
	
	private void pesquisarItem() {
		try {
			System.out.printf("Pesquisa: %s\n",
					mainManager.pesquisarItem(readLine("Id da Sessao: "),
					readLine("Chave: "),
					readLine("Atributo {nome, descricao, categoria}: "),
					readLine("Tipo de ordenacao {crescente, decrescente}: "),
					readLine("Criterio de ordenacao {dataCriacao, reputacao}: ")));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	private void getAtributoItem() {
		try {
			String saida=mainManager.getAtributoItem(readLine("Id item:" ), readLine("Atributo: "));
			System.out.printf("Atributo: %s\n", saida);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	private void cadastrarItem() {
		try {
			String idItem = mainManager.cadastrarItem(readLine("Id sessao: "), readLine("Nome: "),
					readLine("Descricao: "), readLine("Categoria: "));
			System.out.println("Id Item: "+idItem+"\n");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}

	private void getAtributoUsuario() {
		try {
			String saida = mainManager.getAtributoUsuario(readLine("Login: "), readLine("Atributo: "));
			System.out.println("Atributo: "+saida+"\n");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}

	private void abrirSessao() {
		try {
			String idsessao=mainManager.abrirSessao(readLine("Login: "));
			System.out.printf("Id da Sessao: %s\n",idsessao);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}
	private void criaUsuario(){
		try {
			mainManager.criarUsuario(readLine("Login: "), readLine("Nome: "), readLine("Endereco: "));
			System.out.println("Usuario criado com sucesso\n");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
}
